#include "app.h"

int get_que_data(u8 *p,Queue *q);
void systime_initial(u32 frq)//输入为中断频率
{
	//输入频率默认HCLK/8=20MHz=20000000
	SysTick->LOAD=20000000/frq;
	SysTick->CTRL |= 2;//开中断
	SysTick->CTRL |= 1;
}
u32 get_us(void) //获取us计数 1KHz
{
	return SYS_time*1000+(SysTick->LOAD-SysTick->VAL)/20;
}
void SysTick_Delay(u32 n) //延时死等,单位us
{
	u32 st = get_us();
	u32 now = get_us();
	while(now - st < n) now=get_us();
} 
int main(void)
{
	RCC->AHB2ENR|=0x0ff;//使能PORT口时钟
	GPIOA->PUPDR=0;
	GPIOB->PUPDR=0;
	GPIOC->PUPDR=0; //避免错误输出
//加载配置
	AV_FLASH_START=0x08020000; //配置起点,128KB
	AV_FLASH_LEN=KB(64); //配置长度
	cfg_load();
	Stm32_Clock_Init(40,1,8,8);//设置时钟,8MHz*40/1/2=160Mhz
//	MY_NVIC_SetVectorTable(0x08000000,0x8000);
	RCC->AHB2ENR|=0x7ff;//使能所有PORT口时钟
	systime_initial(1000);//Hz

	uart_initial(&uart1,115200); //调试串口
	cmd_ini(); //命令行初始化

	synt_ini();
	app_ini();

	OS_OPEN_INT; //从BootLoader来，必须主动开
	IO_putchar=uart1_putchar; //选择串口1作为指令串口
	while(1)
	{
		int i;
		u8 tt;//队列实参
		for(i=0;i<143;i++) //hal2:1003,hal0:169->1002
		{
			if(uart1.que_rx.dlen>0) //这个只读不用锁
			{
				while(get_que_data(&tt,&uart1.que_rx)==0)
				{
					cmd_fun(tt);
				}
			}
			if(SYS_task & TASK_POOL_100) //100Hz
			{
				SYS_task &= ~TASK_POOL_100;
				app_poll();
			}
			if(SYS_task & TASK_POOL_10) //10Hz
			{
				SYS_task &= ~TASK_POOL_10;
			}
		}
		SYS_idle++;
	}
}
void SysTick_Handler(void) //1000Hz
{
	SYS_time++;
	if(SYS_time%10==2)
	{
		START_TASK(TASK_POOL_100);
	}
	if(SYS_time%100==1)
	{
		SYS_idle_dis=(SYS_idle_dis+SYS_idle)/2;
		SYS_idle=0;
		START_TASK(TASK_POOL_10);
	}
}
int get_que_data(u8 *p,Queue *q)
{
	int rst=1;
	OS_CLOSE_INT;
	rst=Queue_get_1(p,q);
	OS_OPEN_INT;
	return rst;
}

